package com.tstudy.laoshibang.base;

import java.util.List;

import org.apache.http.Header;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.baidu.frontia.api.FrontiaPushMessageReceiver;
import com.google.gson.Gson;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.tstudy.laoshibang.manager.CommunityMessageManager;
import com.tstudy.laoshibang.mode.CommunityMessage;
import com.tstudy.laoshibang.utils.AppShortCutUtil;
import com.tstudy.laoshibang.utils.CommonUtil;
import com.tstudy.laoshibang.utils.LogUtil;
import com.tstudy.laoshibang.utils.SharedPreferencesUtil;

import android.app.NotificationManager;
import android.content.Context;
import android.os.Vibrator;
import android.text.TextUtils;
import de.greenrobot.event.EventBus;

/**
 * Push消息处理receiver。请编写您需要的回调函数， 一般来说： onBind是必须的，用来处理startWork返回值；
 * onMessage用来接收透传消息； onSetTags、onDelTags、onListTags是tag相关操作的回调；
 * onNotificationClicked在通知被点击时回调； onUnbind是stopWork接口的返回值回调
 * 
 * 返回值中的errorCode，解释如下： 
 *  0 - Success
 *  10001 - Network Problem
 *  30600 - Internal Server Error
 *  30601 - Method Not Allowed 
 *  30602 - Request Params Not Valid
 *  30603 - Authentication Failed 
 *  30604 - Quota Use Up Payment Required 
 *  30605 - Data Required Not Found 
 *  30606 - Request Time Expires Timeout
 *  30607 - Channel Token Timeout 
 *  30608 - Bind Relation Not Found 
 *  30609 - Bind Number Too Many
 * 
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。
 * 
 */
@SuppressWarnings("deprecation")
public class BasePushMessageReceiver extends FrontiaPushMessageReceiver {
	NotificationManager mNotificationManager;
	Vibrator vibrator;
    /**
     * 调用PushManager.startWork后，sdk将对push
     * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
     * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
     * 
     * @param context
     *            BroadcastReceiver的执行Context
     * @param errorCode
     *            绑定接口返回值，0 - 成功
     * @param appid
     *            应用id。errorCode非0时为null
     * @param userId
     *            应用user id。errorCode非0时为null
     * @param channelId
     *            应用channel id。errorCode非0时为null
     * @param requestId
     *            向服务端发起的请求id。在追查问题时有用；
     * @return none
     */
    @Override
    public void onBind(Context context, int errorCode, String appid,String userId, String channelId, String requestId) {
    	String responseString = "push onBind errorCode=" + errorCode + " appid="
                + appid + " userId=" + userId + " channelId=" + channelId
                + " requestId=" + requestId;
        LogUtil.d(responseString);

        // 绑定成功，设置已绑定flag，可以有效的减少不必要的绑定请求
        if (errorCode == 0) {
            CommonUtil.setBind(context, true);
        }
        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
//        updateContent(context, responseString);
       if (!TextUtils.isEmpty(userId)) {
    	   BaseApplication.mPushUserId = userId;
    	   BaseApplication.mPushChannelId = channelId;
    	   LogUtil.d("--onbind islogin userid==" + BaseApplication.checkLogin());
    	   if (BaseApplication.checkLogin()) {
    		   HttpManager.getInstance().bindPush(true,new JsonHttpResponseHandler(){
    			@Override
    			public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
    				BaseApplication.showToast("bind result :" + statusCode);
    				super.onSuccess(statusCode, headers, response);
    			}
    		   });	
    	   }
       }
    }
    
    /**
     * 接收透传消息的函数。
     * @param context  上下文
     * @param message  {"title":"ggg","description":"vvv"}"
     *            推送的消息
     * @param customContentString
     * 自定义内容,为空或者json字符串
     * baidu push message="{"title":"吐槽","description":"吐槽","custom_content":{"userNo":"887b5d51a4c34cc6a54042fad85df950","imgIdxName":"","tcId":23}}" customContentString=null
     */
    @Override
    public void onMessage(Context context, String message,String customContentString) {
        String messageString = " baidu push message=\"" + message + "\" customContentString=" + customContentString;
        LogUtil.d(messageString);
        String title = null;
        String content = null;
        String customContent;
        // 自定义内容获取方式，mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
        if (!TextUtils.isEmpty(message)) {
            JSONObject messageObj = null;
            try {
                messageObj = new JSONObject(message);
				title = messageObj.optString("title");
				content = messageObj.optString("description");
				customContent = messageObj.optString("custom_content");
				if (!TextUtils.isEmpty(customContent)) {
					CommunityMessage communityMessage = new Gson().fromJson(customContent, CommunityMessage.class);
					CommunityMessageManager.getInstance().insert(communityMessage);
					EventBus.getDefault().post(communityMessage);
//					vibrator = (Vibrator)BaseApplication.mContext.getSystemService(Context.VIBRATOR_SERVICE);  
//			        long [] pattern = {100,400,100,400};   // 停止 开启 停止 开启   
//			        vibrator.vibrate(pattern,); 
				}
				
				int count = SharedPreferencesUtil.getMessageCount(context)+1;
		        BaseApplication.mMessageCount = count;
		        SharedPreferencesUtil.saveMessageCount(context, count);
//		        Notification notification = buildNotification(context, count, title, content, null);
//		        mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//		        mNotificationManager.notify(count, notification);
//		        if (CommonUtil.isRunningForeground(BaseApplication.mContext)) {
////		        	showMessagePop(context,count);
//		        }
		    	AppShortCutUtil.addNumShortCut(context, SplashActivity.class, true, String.valueOf(count), true);
		    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 接收通知点击的函数。注：推送通知被用户点击前，应用无法通过接口获取通知的内容。
     * 
     * @param context
     *            上下文
     * @param title
     *            推送的通知的标题
     * @param description
     *            推送的通知的描述
     * @param customContentString
     *            自定义内容，为空或者json字符串
     */
    @Override
    public void onNotificationClicked(Context context, String title,
            String description, String customContentString) {
        String notifyString = "通知点击 title=\"" + title + "\" description=\""
                + description + "\" customContent=" + customContentString;
        LogUtil.d(notifyString);

        // 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
        if (!TextUtils.isEmpty(customContentString)) {
            JSONObject customJson = null;
            try {
                customJson = new JSONObject(customContentString);
                @SuppressWarnings("unused")
				String myvalue = null;
                if (customJson.isNull("mykey")) {
                    myvalue = customJson.getString("mykey");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
//        gotoMessage(context);
    }

    /**
     * setTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
     * @param successTags
     *            设置成功的tag
     * @param failTags
     *            设置失败的tag
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onSetTags(Context context, int errorCode,
            List<String> sucessTags, List<String> failTags, String requestId) {
        String responseString = "onSetTags errorCode=" + errorCode
                + " sucessTags=" + sucessTags + " failTags=" + failTags
                + " requestId=" + requestId;
        LogUtil.d(responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
    }

    /**
     * delTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
     * @param successTags
     *            成功删除的tag
     * @param failTags
     *            删除失败的tag
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onDelTags(Context context, int errorCode,
            List<String> sucessTags, List<String> failTags, String requestId) {
        String responseString = "onDelTags errorCode=" + errorCode
                + " sucessTags=" + sucessTags + " failTags=" + failTags
                + " requestId=" + requestId;
        LogUtil.d(responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
    }

    /**
     * listTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示列举tag成功；非0表示失败。
     * @param tags
     *            当前应用设置的所有tag。
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onListTags(Context context, int errorCode, List<String> tags,
            String requestId) {
        String responseString = "onListTags errorCode=" + errorCode + " tags="
                + tags;
        LogUtil.d(responseString);

        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
    }

    /**
     * PushManager.stopWork() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示从云推送解绑定成功；非0表示失败。
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onUnbind(Context context, int errorCode, String requestId) {
        String responseString = "onUnbind errorCode=" + errorCode
                + " requestId = " + requestId;
        LogUtil.d(responseString);

        // 解绑定成功，设置未绑定flag，
        if (errorCode == 0) {
            CommonUtil.setBind(context, false);
        }
        // Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
    }

    /**
     * 在index页面显示消息提示框
     */
//    public void showMessagePop(Context context,int count){
//    	BaseActivity topActivity = (BaseActivity) BaseApplication.getTopActivity();
//		if (topActivity instanceof IndexActivity && topActivity.mFragmentStack.size() ==0) {
//			((IndexActivity)topActivity).showMessageIcon(true);
//			if (((IndexActivity)topActivity).mCurrentIndex == IndexActivity.INDEX_TAB_PROFILE) {
//				((ProfileFragment)topActivity.mTabCurrentFragment).showMessageIcon(true);
//			}
//		}
//    }
    /**
     * 点击通知进入消息列表
     */
//    public void gotoMessage(Context context){
//    	if (CommonUtil.isRunningForeground(BaseApplication.mContext)) {
//			NotificationFragment.add(((BaseActivity)BaseApplication.getTopActivity()).mRootFragmentId,BaseApplication.mUser.id,NotificationFragment.TYPE_INDEX_NEWS);
//		}else{
//			IndexActivity.messageShow(context);
//		}
//    }
    
//    @SuppressWarnings("deprecation")
//	@SuppressLint("NewApi")
//	public Notification buildNotification(Context context,int count,String title,String content,String bigContent){
//		Notification notification = new Notification(R.drawable.logo,title, System.currentTimeMillis());
////		String appName = BaseApplication.getResString(R.string.app_name);
//		notification.flags = Notification.FLAG_AUTO_CANCEL;
//		notification.defaults = Notification.DEFAULT_SOUND;
////		notification.number=count;
////		Intent intent = new Intent(this,IndexActivity.class);
////		intent.putExtra(CONSTANT.ARGS.USER_ID, mUserId);
////		intent.putExtra(CONSTANT.ARGS.mess,true);
////		PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
//		Intent intent=new Intent(CONSTANT.MESSAGE_PUSH_NOTIFICATION_ACTION);//定义广播的动作。  
//		intent.putExtra(CONSTANT.ARGS.SHOW_MESSAGE,true);
//		PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);  
////		if(Build.VERSION.SDK_INT  >= Build.VERSION_CODES.JELLY_BEAN){
////			RemoteViews contentView = new RemoteViews(BaseApplication.mContext.getPackageName(), R.layout.notification_content_view);
////			contentView.setTextViewText(R.id.notification_content_view_content, content.toString());
////			RemoteViews bigContentView = new RemoteViews(WeicoPlusApplication.context.getPackageName(), R.layout.notification_content_view);
////			bigContentView.setTextViewText(R.id.notification_content_view_content, bigContent.toString());
////			notification.contentView = contentView;
////			notification.bigContentView = bigContentView;
////			notification.contentIntent = pi;
////		}else{
//			notification.setLatestEventInfo(context, title, content, pi);
////		}
//		return notification;
//	}
}
